﻿//==============================================================================
// RefClassTemplate 
//------------------------------------------------------------------------------
//
//	参照クラスが持つべきモノをまとめたもの。
//
//	使い方は
//
//		#define SCOPE		MyNamespace	// MyClass のある名前空間等
//		#define CLASSNAME	MyClass		// 参照クラス
//		#define IMPLCLASS	MyImpl		// 実体クラス
//      #define NOTCMP                  // 比較演算子を定義しない場合に
//		#include "RefClassTemplate.h"
//
//==============================================================================

#ifndef SCOPE
#define SCOPE
#endif

//---------------------------------------------------------------------
// ● デフォルトコンストラクタ
//---------------------------------------------------------------------
SCOPE CLASSNAME::CLASSNAME() :
mImpl( NULL )
{}

//---------------------------------------------------------------------
// ● nil からの変換コンストラクタ
//---------------------------------------------------------------------
SCOPE CLASSNAME::CLASSNAME( lnNullPtr nil_ ) :
mImpl( NULL )
{}

//---------------------------------------------------------------------
// ● コピーコンストラクタ
//---------------------------------------------------------------------
SCOPE CLASSNAME::CLASSNAME( const CLASSNAME& obj_ ) :
mImpl( obj_.mImpl )
{
	mImpl = obj_.mImpl;

	if ( mImpl )
	{
		mImpl->addRef();
	}
}

//---------------------------------------------------------------------
// ● デストラクタ
//---------------------------------------------------------------------
SCOPE CLASSNAME::~CLASSNAME()
{
	release();
}

//---------------------------------------------------------------------
// ● カウントを減算・0 になったら mImpl 解放
//---------------------------------------------------------------------
void SCOPE CLASSNAME::release()
{
	LN_SAFE_RELEASE( mImpl );
}

//---------------------------------------------------------------------
// ● operator =
//---------------------------------------------------------------------
SCOPE CLASSNAME& SCOPE CLASSNAME::operator = ( const CLASSNAME& obj_ )
{
	// コピー元と同じ場合は何もしない
	if ( mImpl == obj_.mImpl ) { return *this; }

	// まずはカウンタ減算
	release();

	mImpl = obj_.mImpl;

	// ちゃんと本体がある場合はカウンタを増やす
	if ( mImpl )
	{
		mImpl->addRef();
	}

	return *this;
}

#ifndef NOTCMP

//---------------------------------------------------------------------
// ● operator ==
//---------------------------------------------------------------------
bool SCOPE CLASSNAME::operator == ( const CLASSNAME& obj_ ) const
{
	return ( mImpl == obj_.mImpl );
}

//---------------------------------------------------------------------
// ● operator !=
//---------------------------------------------------------------------
bool SCOPE CLASSNAME::operator != ( const CLASSNAME& obj_ ) const
{
	return ( mImpl != obj_.mImpl );
}

#endif // NOTCMP

// lnote.h からの include ではない場合
#ifndef LNOTE_PRIVATE_HIDE

//---------------------------------------------------------------------
// ● 実装クラスを受け取るコンストラクタ
//---------------------------------------------------------------------
SCOPE CLASSNAME::CLASSNAME( IMPLCLASS* impl_ ) :
mImpl( impl_ )
{
	mImpl->addRef();
}

//---------------------------------------------------------------------
// ● 実装クラス取得
//---------------------------------------------------------------------
IMPLCLASS* SCOPE CLASSNAME::getImpl() const
{
	//mImpl->addRef();
	return mImpl;
}
#endif

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------

#undef SCOPE
#undef CLASSNAME
#undef IMPLCLASS

//==============================================================================
//
//==============================================================================